package com.baidu.day01;

/**
 * Create with Intellij IDEA
 *
 * @Author Q
 * @date 2021/11/22/14:42
 */
public class ArrayDemo {
    public static void main(String[] args) {
//        int[] arr = {1,2,1,3,4,2,3,4,1,2,1};
//        int[] temp = delByTarget(arr,1);
//        for (int i = 0; i < temp.length; i++) {
//            System.out.println(temp[i]);
//        }


        //对象类型存在JVM的堆区

        //通过new关键字来构建一个对象

        //①通过new关键字在JVM的heap区开辟一块空间[每个空间对应唯一的一个内存地址]
        //②这个空间肯定就是用来存储对象,对象的数据是{1,2,3}
        //③将这个对象在堆空间中的内存地址赋值给了引用变量arr1,引用变量保存在栈区

        //概念: 引用和对象之间的关系
        //引用存储的是对象在堆空间中的内存地址

        //"气球理论"
        //1. 一个引用在某个时刻只能指向一个对象
        //2. 一个对象在某个时刻,可以被多个对象引用.
        int[] arr1 = new int[]{1,2,3};
        System.out.println(arr1);//[I@330bedb4

        int[] arr2 = new int[]{1,2,3};
        System.out.println(arr2);//[I@2503dbd3

        // == 永远比较的是值
        System.out.println(arr1 == arr2);//false

        int[] arr3 = new int[]{1,2,3};
        //栈       堆
        //         -> {1,2,3}

        // arr3    -> {4,5,6}
        arr3 = new int[]{4,5,6};

        //{1,2,3}这个数组对象已经没有任何引用指向,成为了垃圾对象,等待GC来进行回收,释放出堆内存.

        //垃圾对象 - 没有任何引用指向的对象 - 垃圾对象.

        int[] arr = {1,2,1,3,4,2,3,4,1,2,1};


        int[] temp = delByTarget(arr,2);

        for (int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }

        System.out.println("===华丽丽的分割线===");

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /**
     * 从数组arr中"删除指定的元素target"
     * @param arr
     * @param target
     * @return
     */
    public static int[] delByTarget(int[] arr,int target){
        //1. 明确的一点 - arr肯定是不可变的.

        //统计target在原数组arr中出现的个数
        int count = 0;//计数器

        //遍历arr
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==target){
                count++;
            }
        }

        if(count == 0){
            //target在arr中不存在
            return arr;//return结束整个方法
        }

        //target在arr中是存在的
        int[] temp = new int[arr.length-count];

        //定义一个下标计数器
        int pos = 0;

        for (int i = 0; i < arr.length; i++) {
            if(arr[i]!=target){
                temp[pos++] = arr[i];
            }

        }
        return temp;

    }
}
